package com.goudan.practice.tree;

/**
 * 整棵树最大距离问题
 * 题解：递归套路
 */
public class MaxDistance {

    private static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

    public static class Info {
        public int maxDistance;
        public int height;

        public Info(int m, int h) {
            maxDistance = m;
            height = h;
        }

    }

    public static void main(String[] args) {

    }

    /**
     * 求整棵树最大距离
     */
    public static Info process(Node x) {
        if (x == null) {
            return new Info(0, 0);
        }
        // 黑盒：假设我的左树能给我信息，右树能给我信息
        Info leftInfo = process(x.left);
        Info rightInfo = process(x.right);
        // 我自己加工我自己当前节点的信息，我当前的最大高度等于左树,右树最大的加1
        int height = Math.max(leftInfo.height, rightInfo.height) + 1;
        int p1 = leftInfo.maxDistance;
        int p2 = rightInfo.maxDistance;
        int p3 = leftInfo.height + rightInfo.height + 1;
        // 我的最大距离等于左树最大距离，右树最大距离，和包括我自己最大距离三个取最大
        int maxDistance = Math.max(Math.max(p1, p2), p3);
        return new Info(maxDistance, height);
    }
}
